const fs = require('fs').promises;
const path = require('path');

// 测试目录（会在当前目录下创建此文件夹用于测试）
const testDir = path.join(__dirname, 'file_test_dir');
// 测试文件路径
const testFile = path.join(testDir, 'test_file.txt');
// 用于移动/重命名的目标路径
const destDir = path.join(testDir, 'dest_dir');
const renamedFile = path.join(testDir, 'renamed_file.txt');

/**
 * 打印分隔线，方便查看测试结果
 * @param {string} title 测试标题
 */
function printSeparator(title) {
    console.log('\n' + '='.repeat(50));
    console.log(`===== ${title} =====`);
    console.log('='.repeat(50) + '\n');
}

/**
 * 初始化测试环境（确保测试目录干净）
 */
async function initTestEnv() {
    printSeparator('初始化测试环境');
    try {
        // 如果测试目录已存在，先删除
        await fs.access(testDir);
        await fs.rm(testDir, { recursive: true, force: true });
        console.log(`已删除旧的测试目录: ${testDir}`);
    } catch (err) {
        // 目录不存在，无需处理
    }
    console.log('初始化完成，准备开始测试');
}

/**
 * 测试文件夹操作：创建和删除文件夹
 */
async function testFolderOperations() {
    printSeparator('测试文件夹操作');
    try {
        // 创建测试文件夹
        await fs.mkdir(testDir);
        console.log(`成功创建文件夹: ${testDir}`);

        // 创建嵌套文件夹（recursive: true 允许创建嵌套目录）
        await fs.mkdir(destDir, { recursive: true });
        console.log(`成功创建嵌套文件夹: ${destDir}`);

        // 验证文件夹是否存在
        await fs.access(testDir);
        await fs.access(destDir);
        console.log('文件夹存在性验证通过');

    } catch (err) {
        console.error('文件夹操作失败:', err.message);
    }
}

/**
 * 测试文件操作：创建、写入和读取文件
 */
async function testFileCreateAndWrite() {
    printSeparator('测试文件创建与写入');
    try {
        // 写入数据到文件（不存在则创建）
        const content = '这是测试文件的内容\n第二行内容\n时间: ' + new Date().toLocaleString();
        await fs.writeFile(testFile, content, 'utf8');
        console.log(`成功创建并写入文件: ${testFile}`);

        // 读取文件内容验证
        const readContent = await fs.readFile(testFile, 'utf8');
        console.log('文件内容验证:');
        console.log('-------------------');
        console.log(readContent);
        console.log('-------------------');

    } catch (err) {
        console.error('文件创建/写入失败:', err.message);
    }
}

/**
 * 测试文件重命名操作
 */
async function testFileRename() {
    printSeparator('测试文件重命名');
    try {
        // 重命名文件
        await fs.rename(testFile, renamedFile);
        console.log(`成功将文件从 ${path.basename(testFile)} 重命名为 ${path.basename(renamedFile)}`);

        // 验证原文件是否不存在，新文件是否存在
        try {
            await fs.access(testFile);
            console.warn('警告: 原文件仍存在');
        } catch {
            console.log('原文件已不存在，重命名生效');
        }

        await fs.access(renamedFile);
        console.log('新文件存在性验证通过');

    } catch (err) {
        console.error('文件重命名失败:', err.message);
    }
}

/**
 * 测试文件移动操作
 */
async function testFileMove() {
    printSeparator('测试文件移动');
    try {
        // 目标路径（移动到 destDir 文件夹下，保持原文件名）
        const movedFile = path.join(destDir, path.basename(renamedFile));

        // 移动文件
        await fs.rename(renamedFile, movedFile);
        console.log(`成功将文件从 ${path.basename(renamedFile)} 移动到 ${destDir}`);

        // 验证移动结果
        try {
            await fs.access(renamedFile);
            console.warn('警告: 原位置文件仍存在');
        } catch {
            console.log('原位置文件已移除，移动生效');
        }

        await fs.access(movedFile);
        console.log('目标位置文件存在性验证通过');

    } catch (err) {
        console.error('文件移动失败:', err.message);
    }
}

/**
 * 测试文件删除操作
 */
async function testFileDelete() {
    printSeparator('测试文件删除');
    try {
        const fileToDelete = path.join(destDir, path.basename(renamedFile));

        // 删除文件
        await fs.unlink(fileToDelete);
        console.log(`成功删除文件: ${fileToDelete}`);

        // 验证文件是否已删除
        try {
            await fs.access(fileToDelete);
            console.warn('警告: 文件删除失败，仍存在');
        } catch {
            console.log('文件已成功删除');
        }

    } catch (err) {
        console.error('文件删除失败:', err.message);
    }
}

/**
 * 测试文件夹删除操作（清空并删除测试目录）
 */
async function testFolderDelete() {
    printSeparator('测试文件夹删除');
    try {
        // 删除整个测试目录（包括子目录和文件）
        await fs.rm(testDir, { recursive: true, force: true });
        console.log(`成功删除文件夹及其内容: ${testDir}`);

        // 验证文件夹是否已删除
        try {
            await fs.access(testDir);
            console.warn('警告: 文件夹删除失败，仍存在');
        } catch {
            console.log('文件夹已成功删除');
        }

    } catch (err) {
        console.error('文件夹删除失败:', err.message);
    }
}

/**
 * 主函数：按顺序执行所有测试
 */
async function runAllTests() {
    try {
        await initTestEnv();
        await testFolderOperations();
        await testFileCreateAndWrite();
        await testFileRename();
        await testFileMove();
        await testFileDelete();
        await testFolderDelete();

        printSeparator('所有测试完成');
        console.log('测试流程全部执行完毕');
    } catch (err) {
        console.error('\n❌ 测试过程中发生错误:', err.message);
    }
}

// 启动测试
runAllTests();
